package com.m1.tzolkin.model.players;

import java.io.Serializable;
import java.util.Collection;

import com.m1.tzolkin.model.buildables.IFarm;
import com.m1.tzolkin.model.exceptions.NotEnoughCornException;
import com.m1.tzolkin.model.log.ILog;

/**
 * Un mod�le de gestionnaire de ma�s.
 * Un gestionnaire de ma�s est d�fini par la quantit� de ma�s
 *  qu'il poss�de, et du parc de fermes qu'il g�re.
 * Celles-ci lui indiquent comment il doit nourrir les ouvriers
 *  lorsqu'on lui en donne l'ordre.
 * Le gestionnaire conna�t le joueur � qui il appartient, afin
 *  de lui retirer des points de victoire s'il ne peut nourrir
 *  ses ouvriers.
 * 
 * @inv <pre>
 *     getCorn() >= 0
 *     getFarms(t) >= 0 </pre>
 * 
 * @cons <pre>
 * $DESC$
 *     Un gestionnaire sans fermes ni ma�s appartenant au joueur p.
 * $ARGS$
 *     ITZPlayer p
 * $PRE$
 *     p != null
 * $POST$
 *     p est le propri�taire de ce gestionnaire
 *     getCorn() == 0
 *     getFarms(t) == 0 </pre>
 *     
 * @cons <pre>
 * $DESC$
 *     Un gestionnaire sans fermes avec n ma�s appartenant au joueur p.
 * $ARGS$
 *     int n, ITZPlayer p
 * $PRE$
 *     n >= 0 p != null
 * $POST$
 *     p est le propri�taire de ce gestionnaire
 *     getCorn() == n
 *     getFarmes(t) == 0 </pre>
 *
 */
public interface ICornManager extends Serializable {

	// REQUETES
	
	/**
	 * Retourne la quantit� de ma�s accumul�e par ce gestionnaire.
	 */
	int getCorn();
	
	/**
	 * Retourne les fermes dans le parc de ce gestionnaire.
	 */
	Collection<IFarm> getFarms();
	
	// COMMANDES
	
	/**
	 * Ajoute i ma�s.
	 * @pre <pre>
	 *     i >= 0 </pre>
	 * @post <pre>
	 *     getCorn() == old getCorn() + i </pre>
	 */
	void addCorn(int i);
	
	/**
	 * Retire i ma�s.
	 * @pre <pre>
	 *     i >= 0 && getCorn() >= i </pre>
	 * @post <pre>
	 *     getCorn() == old getCorn() - i </pre>
	 */
	void removeCorn(int i) throws NotEnoughCornException;
	
	/**
	 * Ajoute la ferme f au parc de ce gestionnaire.
	 * @pre <pre>
	 *     f != null </pre>
	 */
	void addFarm(IFarm f);
	
	/**
	 * Nourrit les ouvriers du propri�taire de ce gestionnaire.
	 */
	void feedWorkers(ILog log);
	
}
